
// 测试1
//  测试长连接

#include "../source/server.hpp"
#include "../source/http/http.hpp"

// int main()
// {

//     Socket client;
//     client.CreateClient(12700, "127.0.0.1");
//     std::string req = "GET /kanade HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     while (true)
//     {
//         int ret = client.Send(&req[0], req.size());
//         assert(ret > 0);
//         char buf[1024] = {0};
//         ret = client.Recv(buf, 1023);
//         assert(ret > 0);
//         DBG_LOG("%s", buf);
//         sleep(15);
//     }
//     return 0;
// }

// 测试2
//
//  1.如果数据只发送一次，服务器得不到完整的请求，就不会进行业务处理，客户端也就得不到响应，最终超时关闭连接
//
//  2.连着给服务器发送了多次请求，服务器会将后边的请求当作前边请求的正文进行处理，而后边处理的时候有可能就会因为处理错误
//
//

// int main()
// {

//     Socket client;
//     client.CreateClient(12700, "127.0.0.1");
//     std::string req = "GET /kanade HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 50\r\n\r\nnightcord";
//     while (true)
//     {
//         int ret = client.Send(&req[0], req.size());
//         ret = client.Send(&req[0], req.size());
//         ret = client.Send(&req[0], req.size());
//         assert(ret > 0);
//         char buf[1024] = {0};
//         ret = client.Recv(buf, 1023);
//         assert(ret > 0);
//         DBG_LOG("%s", buf);
//         sleep(15);
//     }
//     return 0;
// }

// 测试3  业务处理超时
// 当服务器达到了一个性能瓶颈，在一次业务处理中花费了太长时间
// 1.在一次业务处理中耗费太长时间，导致其它的连接也被连累超时，其它的连接有可能会被拖累超时释放
// 假设现在 12345描述符就绪了，在处理1的时候花费了30s处理完，超时了，导致2345描述符长时间没有刷新活跃度
//   a.如果接下来的2345描述符都是通信连接描述符，如果都就绪了，则并不影响，因为接下来就会处理并刷新活跃度
//   b.如果接下来的2号描述符是定时器事件描述符，定时器触发超时，执行定时任务，就会将345描述符释放掉
//     这时候一旦345描述符对应的连接被释放，接下来在处理345事件的时候就会导致程序崩溃（内存访问错误）
//     因此这时候，在本次事件处理中，并不能直接对连接进行释放，而应该将释放操作压入到任务池中
//     等到事件处理完了执行任务池中的任务的时候，再去释放

// int main()
// {

//     for (int i = 0; i < 10; i++)
//     {
//         int pid = fork();
//         if (pid < 0)
//         {
//             DBG_LOG("fork error");
//             return -1;
//         }
//         else if (pid == 0)
//         {
//             Socket client;
//             client.CreateClient(12700, "127.0.0.1");
//             std::string req = "GET /kanade HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//             while (true)
//             {
//                 int ret = client.Send(&req[0], req.size());
//                 ret = client.Send(&req[0], req.size());
//                 ret = client.Send(&req[0], req.size());
//                 assert(ret > 0);
//                 char buf[1024] = {0};
//                 ret = client.Recv(buf, 1023);
//                 assert(ret > 0);
//                 DBG_LOG("%s", buf);
//                 sleep(15);
//             }
//             client.Close();
//             exit(0);
//         }
//     }

//     while (true)
//         ;

//     return 0;
// }

// 测试4 一次性给服务器发送多条请求（应该每个请求都得到处理）

// int main()
// {

//     Socket client;
//     client.CreateClient(12700, "127.0.0.1");
//     std::string req = "POST /mafuyu HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     req += "POST /mafuyu HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     req += "POST /mafuyu HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     while (true)
//     {
//         int ret = client.Send(&req[0], req.size());
//         assert(ret > 0);
//         char buf[1024] = {0};
//         ret = client.Recv(buf, 1023);
//         assert(ret > 0);
//         DBG_LOG("%s", buf);
//         sleep(15);
//     }
//     return 0;
// }

// 测试5 大文件传输测试
// 给服务器上传一个大文件 服务器将文件保存下来 观察处理结果
// 上传的文件 和服务器保存的文件一致

// 创建1个1G的大文件：dd if=/dev/zero of=./nightcord.txt bs=1G count=1

int main()
{

    Socket client;
    client.CreateClient(12700, "127.0.0.1");
    std::string req = "PUT /ena HTTP/1.1\r\nConnection: keep-alive\r\n";
    std::string body;
    bool ret1 = Util::ReadFile("./nightcord.txt", &body);
    req += "Content-Length: " + std::to_string(body.size()) + "\r\n\r\n";

    // while (true)
    //{
    int ret = client.Send(&req[0], req.size());
    ret = client.Send(&body[0], body.size());
    assert(ret > 0);
    char buf[1024] = {0};
    ret = client.Recv(buf, 1023);
    assert(ret > 0);
    DBG_LOG("%s", buf);
    sleep(15);
    //}
    return 0;
}